﻿
namespace SistemaLogistica.Windows.Forms.BienPatrimonial.Mantenedores
{
    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using EDOSwit.Controls.Helpers;
    using EDOSwit.Controls.Types;
    using EDOSwit.Controls.UserControls;
    using SistemaLogistica.Business.Entities;
    using SistemaLogistica.Business.Logic;
    using SistemaLogistica.Windows.Helpers;

    public partial class CwfClienteJuridico : MantenedorSeguro, Sujeto
    {
        private List<Observador> observadores = new List<Observador>();

        public CwfClienteJuridico()
        {
            InitializeComponent();
        }

        protected override void LoadPermisos()
        {
            this.TsMenu.Permisos.AddRange(Metodos.GetPermisos(Convert.ToByte(this.Tag)));
        }

        protected override void FocusKeyPress(object sender, KeyPressEventArgs e)
        {
            base.FocusKeyPress(sender, e);
        }

        protected override void InitialLoad()
        {
            try
            {
                this.MantenedorBindingSource.DataSource = ClienteManager.Instancia.ListarJuridicos();
                this.dgvMantenedor.DataSource = this.MantenedorBindingSource;
                OcultarColumnas();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
        }

        private void OcultarColumnas()
        {
            this.dgvMantenedor.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dgvMantenedor.Columns["IdCliente"].Visible = false;
            this.dgvMantenedor.Columns["IdJuridico"].Visible = false;
            this.dgvMantenedor.Columns["Email"].Visible = false;
        }

        protected override void LoadData(object obj)
        {
            Juridico juridico = obj as Juridico;
            if (juridico != null)
            {
                this.identificador = juridico.IdCliente;
                this.lblIdJuridico.Text = juridico.IdJuridico.ToString();
                this.txtRUC.Text = juridico.RUC;
                this.txtRazonSocial.Text = juridico.RazonSocial;
                this.txtGiroNegocio.Text = juridico.GiroNegocio;
                this.txtTelefono.Text = juridico.Telefono;
                this.txtEmail.Text = juridico.Email;
                this.txtDireccion.Text = juridico.Direccion;
            }
        }

        protected override void EventoNuevo()
        {
            this.txtRUC.Focus();
        }

        protected override void EventoEditar()
        {
            this.txtRUC.Focus();
        }

        protected override void BuscarData()
        {
            try
            {
                this.MantenedorBindingSource.DataSource = ClienteManager.Instancia.BuscarJuridico(this.txtBuscar.Text+"%%%%%%%%%%%");
                this.dgvMantenedor.DataSource = this.MantenedorBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
        }

        protected override bool SaveData()
        {
            bool result = false;
            int posicion = this.MantenedorBindingSource.Position;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        ClienteManager.Instancia.AgregarJuridico(GetCliente());
                        break;
                    case EstadoActual.Editar:
                        ClienteManager.Instancia.EditarJuridico(GetCliente());
                        break;
                    case EstadoActual.Eliminar:
                        ClienteManager.Instancia.Eliminar(Convert.ToInt32(this.identificador));
                        posicion -= 1;
                        break;
                    default:
                        break;
                }
                result = true;
                InitialLoad();
                this.MantenedorBindingSource.Position = posicion;
                Publicar(this.ParentForm.Text);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
            return result;
        }

        private Juridico GetCliente()
        {
            return new Juridico
            {
                RUC = this.txtRUC.Text,
                RazonSocial = this.txtRazonSocial.Text,
                GiroNegocio = this.txtGiroNegocio.Text,
                IdCliente = Convert.ToInt32(this.identificador),
                IdJuridico = int.Parse(this.lblIdJuridico.Text),
                Telefono = this.txtTelefono.Text,
                Email = this.txtEmail.Text,
                Direccion = this.txtDireccion.Text
            };
        }

        protected override bool ValidateData()
        {
            bool result = true;

            if (this.txtRUC.Text.Length != 11)
            {
                this.errValidator.SetError(this.txtRUC, "Ingresar RUC.");
                result = false;
            }
            else
            {
                if (ClienteManager.Instancia.BuscarJuridico(this.txtRUC.Text).Count > 0)
                {
                    this.errValidator.SetError(this.txtRUC, "Este RUC ya existe.");
                    result = false;
                }
                else
                {
                    this.errValidator.SetError(this.txtRUC, string.Empty);
                }
            }
            if (string.IsNullOrEmpty(this.txtRazonSocial.Text.Trim()))
            {
                this.errValidator.SetError(this.txtRazonSocial, "Ingresar Nombre.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtRazonSocial, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtDireccion.Text.Trim()))
            {
                this.errValidator.SetError(this.txtDireccion, "Ingresar Dirección.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtDireccion, string.Empty);
            }
            if (!string.IsNullOrEmpty(this.txtEmail.Text.Trim()))
            {
                if (!ValidationManager.IsEmail(this.txtEmail.Text))
                {
                    this.errValidator.SetError(this.txtEmail, "Formato de E-mail incorrecto.");
                    result = false;
                }
                else
                {
                    this.errValidator.SetError(this.txtEmail, string.Empty);
                }
            }
            else
            {
                this.errValidator.SetError(this.txtEmail, string.Empty);
            }

            return result;
        }

        protected override void ClearControls()
        {
            this.identificador = 0;
            this.lblIdJuridico.Text = "0";
            base.ClearControls();
        }

        #region Miembros de Sujeto

        public void Registrar(Observador observador)
        {
            this.observadores.Add(observador);
        }

        public void Publicar(object mensaje)
        {
            foreach (Observador observador in this.observadores)
            {
                observador.Notificar(mensaje);
            }
        }

        public void Remover(Observador observador)
        {
            this.observadores.Remove(observador);
        }

        #endregion
    }
}
